package com.huiyeji.hui.service.impl;

import com.huiyeji.hui.entity.GroupMsg;
import com.huiyeji.hui.entity.Msg;
import com.huiyeji.hui.entity.PrivateMsg;
import com.huiyeji.hui.exception.HuiException;
import com.huiyeji.hui.mapper.GroupMsgMapper;
import com.huiyeji.hui.mapper.MsgMapper;
import com.huiyeji.hui.mapper.PrivateMsgMapper;
import com.huiyeji.hui.mapper.SystemMsgMapper;
import com.huiyeji.hui.service.MessageService;
import com.huiyeji.hui.utils.ErrorEnum;
import com.huiyeji.hui.vo.GroupOrPrivateMessageVo;
import com.huiyeji.hui.vo.MessageVo;
import com.huiyeji.hui.vo.SystemMessageVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author zhaoduo
 */
@Service
public class MessageServiceImpl implements MessageService {

    private final SystemMsgMapper systemMsgMapper;

    private final GroupMsgMapper groupMsgMapper;

    private final PrivateMsgMapper privateMsgMapper;

    private final MsgMapper msgMapper;

    @Autowired
    public MessageServiceImpl(SystemMsgMapper systemMsgMapper,
                              GroupMsgMapper groupMsgMapper,
                              PrivateMsgMapper privateMsgMapper,
                              MsgMapper msgMapper) {
        this.systemMsgMapper = systemMsgMapper;
        this.groupMsgMapper = groupMsgMapper;
        this.privateMsgMapper = privateMsgMapper;
        this.msgMapper = msgMapper;
    }


    @Override
    public List<SystemMessageVo> getSystemMessages() {
        return systemMsgMapper.getSystemMessages();
    }

    @Override
    public List<GroupOrPrivateMessageVo> getGroupMessages(Long uid, Long gid) {
        return groupMsgMapper.getGroupMessagesByGid(gid);
    }

    @Override
    public List<GroupOrPrivateMessageVo> getPrivateMessages(Long uid, Long fid) {
        return privateMsgMapper.getPrivateMessages(uid,fid);
    }

    @Override
    public void addGroupMsg(MessageVo vo) {
        Msg msg = insertMsg(vo);
        insertGroupMsg(msg,vo);
    }

    @Override
    public void addPrivateMsg(MessageVo vo) {
        Msg msg = insertMsg(vo);
        insertPrivateMsg(msg,vo);
    }

    @Override
    public List<Long> getAllMessageIdOfGroup(Long gid) {
        return groupMsgMapper.getMidListByGid(gid);
    }

    @Override
    public void deleteAllGroupMessage(Long gid) {
        groupMsgMapper.deleteByGid(gid);
    }

    @Override
    public void deleteMessages(List<Long> midList) {
        msgMapper.deleteByMidList(midList);
    }

    @Override
    public List<Long> getAllMessageIdOfPrivate(Long uid, Long fid) {
        return privateMsgMapper.getMidListByTwoUser(uid,fid);
    }

    @Override
    public void deletePrivateMessageFromTwoUser(Long uid, Long fid) {
        privateMsgMapper.deleteByTwoUser(uid,fid);
    }

    private void insertPrivateMsg(Msg msg, MessageVo vo) {
        PrivateMsg privateMsg = new PrivateMsg();
        privateMsg.setMid(msg.getMid());
        privateMsg.setSender(vo.getSender());
        privateMsg.setReceiver(vo.getReceiver());
        int row = privateMsgMapper.insert(privateMsg);
        if (row != 1){
            throw new HuiException(ErrorEnum.SEND_ERROR);
        }
    }


    private Msg insertMsg(MessageVo vo){
        Msg msg = new Msg();
        msg.setContent(vo.getContent());
        msg.setCreateTime(vo.getCreateTime());
        int row = msgMapper.insertSelective(msg);
        if (row != 1){
            throw new HuiException(ErrorEnum.SEND_ERROR);
        }
        return msg;
    }

    private void insertGroupMsg(Msg msg,MessageVo vo){
        GroupMsg groupMsg = new GroupMsg();
        groupMsg.setMid(msg.getMid());
        groupMsg.setGid(vo.getReceiver());
        groupMsg.setSender(vo.getSender());
        int row = groupMsgMapper.insert(groupMsg);
        if (row != 1){
            throw new HuiException(ErrorEnum.SEND_ERROR);
        }
    }
}
